home *** CD-ROM | disk | FTP | other *** search
/ GEGA 010 / GEGA010.iso / Mods / Doom 3 / BloodyScreme / bloodymess.pk4 / script / weapon_machinegun.script < prev   
Text File  |  2004-08-04  |  3KB  |  135 lines

  1. /***********************************************************************
  2.  
  3. weapon_machinegun.script
  4.  
  5. ***********************************************************************/
  6.  
  7. #define MACHINEGUN_FIRERATE            0.05        // ~10 per second
  8. #define MACHINEGUN_LOWAMMO            10
  9. #define MACHINEGUN_NUMPROJECTILES    1
  10.  
  11. // blend times
  12. #define MACHINEGUN_IDLE_TO_LOWER    4
  13. #define MACHINEGUN_IDLE_TO_FIRE        0
  14. #define    MACHINEGUN_IDLE_TO_RELOAD    4
  15. #define MACHINEGUN_RAISE_TO_IDLE    4
  16. #define MACHINEGUN_FIRE_TO_IDLE        0
  17. #define MACHINEGUN_RELOAD_TO_IDLE    4
  18.  
  19. object weapon_machinegun : weapon_base {
  20.     float        next_attack;
  21.     float        spread;
  22.     
  23.     void        init();
  24.     
  25.     void        Lower();
  26.     void        Raise();
  27.     void        Idle();
  28.     void        Fire();
  29.     void        Reload();
  30.     void        ExitCinematic();
  31. };
  32.  
  33. void weapon_machinegun::init() {
  34.     next_attack = 0;
  35.     spread        = getFloatKey( "spread" );
  36.     weaponState( "Raise", 0 );
  37. }
  38.  
  39. void weapon_machinegun::Raise() {
  40.     weaponRising();
  41.     playAnim( ANIMCHANNEL_ALL, "raise" );
  42.     waitUntil( animDone( ANIMCHANNEL_ALL, MACHINEGUN_RAISE_TO_IDLE ) );
  43.     weaponState( "Idle", MACHINEGUN_RAISE_TO_IDLE );
  44. }
  45.  
  46. void weapon_machinegun::Lower() {
  47.     weaponLowering();
  48.     playAnim( ANIMCHANNEL_ALL, "putaway" );
  49.     waitUntil( animDone( ANIMCHANNEL_ALL, 0 ) );
  50.     weaponHolstered();
  51.     waitUntil( WEAPON_RAISEWEAPON );
  52.     weaponState( "Raise", 0 );
  53. }
  54.  
  55. void weapon_machinegun::Idle() {
  56.     float currentTime;
  57.     float ammoClip;
  58.     float avail;
  59.     float clip_size;
  60.     
  61.     clip_size = clipSize();    
  62.     
  63.     if ( !ammoInClip() ) {
  64.         weaponOutOfAmmo();
  65.     } else {
  66.         weaponReady();
  67.     }
  68.  
  69.     playCycle( ANIMCHANNEL_ALL, "idle" );
  70.     while( 1 ) {
  71.         if ( WEAPON_LOWERWEAPON ) {
  72.             weaponState( "Lower", MACHINEGUN_IDLE_TO_LOWER );
  73.         }
  74.         currentTime = sys.getTime();
  75.         ammoClip = ammoInClip();
  76.         if ( ( currentTime >= next_attack ) && WEAPON_ATTACK ) {
  77.             if ( ammoClip > 0 ) {
  78.                 weaponState( "Fire", MACHINEGUN_IDLE_TO_FIRE );
  79.             } else if ( ammoAvailable() > 0 ) {
  80.                 if ( autoReload() ) {
  81.                     netReload();
  82.                     weaponState( "Reload", MACHINEGUN_IDLE_TO_RELOAD );
  83.                 }
  84.             }
  85.         }
  86.         if ( WEAPON_RELOAD && ( ammoAvailable() > ammoClip ) && ( ammoClip < clip_size ) ) {
  87.             netReload();
  88.             weaponState( "Reload", MACHINEGUN_IDLE_TO_RELOAD );
  89.         }
  90.         if ( WEAPON_NETRELOAD ) {
  91.             WEAPON_NETRELOAD = false;
  92.             weaponState( "Reload", MACHINEGUN_IDLE_TO_RELOAD );
  93.         }
  94.         waitFrame();
  95.     }
  96. }
  97.  
  98. void weapon_machinegun::Fire() {
  99.     float ammoClip;
  100.     float currentTime;
  101.     
  102.     next_attack = sys.getTime() + MACHINEGUN_FIRERATE;
  103.     
  104.     ammoClip = ammoInClip();
  105.     if ( ammoClip == MACHINEGUN_LOWAMMO ) {
  106.         startSound( "snd_lowammo", SND_CHANNEL_ITEM, true );
  107.     }
  108.     
  109.     launchProjectiles( MACHINEGUN_NUMPROJECTILES, spread, 0, 1.0, 1.0 );
  110.     playAnim( ANIMCHANNEL_ALL, "fire" );
  111.     while( !animDone( ANIMCHANNEL_ALL, MACHINEGUN_FIRE_TO_IDLE ) ) {
  112.         currentTime = sys.getTime();
  113.         ammoClip = ammoInClip();
  114.         if ( ( currentTime >= next_attack ) && WEAPON_ATTACK && ( ammoClip > 0 ) ) {
  115.             weaponState( "Fire", 0 );
  116.         }
  117.         waitFrame();
  118.     }
  119.  
  120.     weaponState( "Idle", MACHINEGUN_FIRE_TO_IDLE );
  121. }
  122.  
  123. void weapon_machinegun::Reload() {
  124.     weaponReloading();
  125.     playAnim( ANIMCHANNEL_ALL, "reload" );
  126.     waitUntil( animDone( ANIMCHANNEL_ALL, MACHINEGUN_RELOAD_TO_IDLE ) );
  127.     addToClip( clipSize() );
  128.     weaponState( "Idle", MACHINEGUN_RELOAD_TO_IDLE );
  129. }
  130.  
  131. void weapon_machinegun::ExitCinematic() {
  132.     next_attack = 0;
  133.     weaponState( "Idle", 0 );
  134. }
  135.